package main

import "fmt"

func main() {
	// 闭包可以直接调用外部变量，
	// 也会改变外部变量的值
	x := 10
	f1 := func(i int, j int) (sum int) {
		sum = i + j + x
		x = 123
		return
	}
	fmt.Println(f1(1, 2))
	fmt.Println(x)
	fmt.Println(test2()()) // 1
	fmt.Println(test2()()) // 1
	f2 := test2()
	fmt.Println(f2()) // 1
	fmt.Println(f2()) // 4

}

// 闭包不关心作用域，闭包在(引用在)则变量在
func test2() func() int {
	var x int
	return func() int {
		x++
		return x * x
	}
}
